#ifndef UPDATER_H
#define UPDATER_H

#include "_Global/HTTP/HTTPDownload.h"

#include <QObject>

#define _T QObject::tr



//更新类
class Updater : public QObject
{
    Q_OBJECT

public:
    enum _Operate_Type  //操作类型
    {
        _Operate_Create,    //创建
        _Operate_Replace,   //替换
        _Operate_Delete,    //删除
        _Operate_Nothing,   //没有改动
    };

    enum _Operate_Result    //操作结果
    {
        _Operate_Success,
        _Operate_Fail,
    };

    struct _UpdateFileInfo  //要更新的文件信息
    {
        _UpdateFileInfo() {}
        QString m_strNewFilePath;
        QString m_strOldFilePath;
        int m_nNewFileVersion;
        int m_nOldFileVersion;
    };

signals:
    //每个新文件列表中文件操作完成后的信号
    void s_OperateFileInfo(QString file, _Operate_Type type, _Operate_Result result, int errorCode = 0);
    //升级消息
    void s_UpdateMessage(const QString& msg);
    //更新进度信号（新的文件数）
    void s_UpdateProccess(int count, int total);
    //所有更新完毕
    void s_UpdateFinished(int code, const QString &msg = "");


public:
    explicit Updater(QObject *parent = nullptr);
    virtual ~Updater();

public:

    //2.开始更新
    bool startUpdate(QUrl urlUpdateInfoJson);

    //3.更新完毕
    void UpdateSuccessed(bool bUpdated);

public:
    int newVersion()
    {
        return m_nNewVersion;
    }
    int oldVersion()
    {
        return m_nOldVersion;
    }

protected:

    //解析Json，将结果放入参数
    bool parseJsonVersion(QByteArray &baJsonData, int &version, QVariantMap &mapFileInfo, QString &baseURL);

    //暂时不用!!(例子)
    bool parseJsonFiles(QByteArray &baJsonData);

    //循环更新文件
    //根据新旧列表的版本来判断是否升级
    void updateFiles();

    //删除所有旧文件（旧文件列表中存在而新文件列表中不存在的所有文件）
    void deleteOldFiles();

public slots:
    //UpdateInfo.Json信息文件下载完毕,进行总版本比较是否进行升级
    void onJsonDownloadFinished(int errorType, QNetworkReply::NetworkError error, int status_code);

    //升级文件下载完毕处理
    void onFileDownloadFinished(int errorType, QNetworkReply::NetworkError error, int status_code);


//数据成员
public:

private:
    HTTPDownload m_HTTPDownload;


    QByteArray m_baNewJsonData;     //网络最新UpdateInfo.json的内容


//升级Json文件信息

    //总版本号（新/旧）
    int m_nNewVersion, m_nOldVersion;
    //QByteArray newUpdateInfo;
    QVariantMap m_mapNewFileInfo; //新的 所有文件 信息
    QVariantMap m_mapOldFileInfo; //旧的 所有文件 信息
    QVariantMap::const_iterator m_mapInteratorFileInfo;   //保存遍历中的 新的 所有文件的 指针
    int m_nToTalFileCount;      //总共文件
    int m_nUpdatedFileCount;    //已经更新的文件数(递增)

    //下载基地址
    QString m_strBaseDownloadUrl;
    _UpdateFileInfo m_UpdateFileInfo;    //正在下载的新旧文件信息

};

#endif // UPDATER_H
